/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.udistrisisbici.dao;

import static com.udistrisisbici.dao.UsuarioDao.logger;
import com.udistrisisbici.exception.DaoException;
import com.udistrisisbici.util.logs.Logger;
import com.udistrisisbici.vo.BicicletaVO;
import com.udistrisisbici.vo.UsuarioVO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author nicardonaa
 */
public class BicicletaDao extends UtilDao {

    public static Logger logger;

    static {
        logger = Logger.getLogger(BicicletaDao.class);
    }

    public int insertarBicicleta(BicicletaVO bicicletaVO) throws DaoException, SQLException {

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int respuesta = 0;

        try {

            con = getConeccionSisbici();
            String sentenciaSql = "INSERT INTO public.bicicleta(cod_barras, identificacion_usu, marca, color, num_serie, observaciones) VALUES(?, ?, ?, ?, ?, ?)";
            ps = con.prepareStatement(sentenciaSql);

            int i = 1;
            ps.setString(i++, bicicletaVO.getCodBarras());
            ps.setString(i++, bicicletaVO.getUsuNumIdentificacion());
            ps.setString(i++, bicicletaVO.getMarca());
            ps.setString(i++, bicicletaVO.getColor());
            ps.setString(i++, bicicletaVO.getNumSerie());
            ps.setString(i++, bicicletaVO.getObservaciones());
            
            StringBuilder sbLog = new StringBuilder();
            sbLog.append("SQL log: [").append(sentenciaSql).append("]");
            sbLog.append("[").append(bicicletaVO.getCodBarras()).append(", ");
            sbLog.append("[").append(bicicletaVO.getUsuNumIdentificacion()).append(", ");
            sbLog.append("[").append(bicicletaVO.getMarca()).append(", ");
            sbLog.append("[").append(bicicletaVO.getColor()).append(", ");
            sbLog.append("[").append(bicicletaVO.getNumSerie()).append(", ");
            sbLog.append("[").append(bicicletaVO.getObservaciones()).append("]");
            
            logger.info(sbLog.toString());
            
            long t1 = System.currentTimeMillis();
            respuesta = ps.executeUpdate();
            long t2 = System.currentTimeMillis();
            
            logger.info("Tiempo SQL: " + (t2 - t1) + "ms.");

        } catch (DaoException de) {
            logger.error("fun:insertarBicicleta -> Error de conexión en la ejecuciópn del SQL", de);
            throw de;
        } catch (SQLException se) {
            logger.error("fun:insertarBicicleta -> Error en la ejecución del SQL", se);
            throw se;
        } finally {
            closeResources(con, ps, rs);
        }
        return respuesta;
    }
    public List<BicicletaVO> buscarBici(BicicletaVO biciVO) throws DaoException, SQLException {

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        List<BicicletaVO> bici = new ArrayList<BicicletaVO>();

        try {
            con = getConeccionSisbici();
            StringBuilder sql = new StringBuilder();
            sql.append("SELECT cod_barras,identificacion_usu , marca, color, num_serie ");
            sql.append("FROM public.bicicleta ");
            sql.append("where identificacion_usu is not null ");

            if (biciVO.getCodBarras() != null && !biciVO.getCodBarras().equals("")) {
                sql.append("and cod_barras = ? ");
            }
            if (biciVO.getUsuNumIdentificacion() != null && !biciVO.getUsuNumIdentificacion().equals("")) {
                sql.append("and identificacion_usu = ? ");
            }
            if (biciVO.getMarca() != null && !biciVO.getMarca().equals("")) {
                sql.append("and marca = ? ");
            }
            if (biciVO.getColor() != null && !biciVO.getColor().equals("")) {
                sql.append("and color = ? ");
            } 
            if (biciVO.getNumSerie() != null && !biciVO.getNumSerie().equals("")) {
                sql.append("and num_serie = ? ");
            }

            ps = con.prepareStatement(sql.toString());
            int i = 1;

            if (biciVO.getCodBarras() != null && !biciVO.getCodBarras().equals("")) {
                ps.setString(i++, biciVO.getCodBarras());
            }
            if (biciVO.getUsuNumIdentificacion() != null && !biciVO.getUsuNumIdentificacion().equals("")) {
                ps.setString(i++, biciVO.getUsuNumIdentificacion());
            }
            if (biciVO.getMarca() != null && !biciVO.getMarca().equals("")) {
                ps.setString(i++, biciVO.getMarca());
            }
            if (biciVO.getColor() != null && !biciVO.getColor().equals("")) {
                ps.setString(i++, biciVO.getColor());
            }
            if (biciVO.getNumSerie() != null && !biciVO.getNumSerie().equals("")) {
                ps.setString(i++, biciVO.getNumSerie());
            }
 
            rs = ps.executeQuery();

            BicicletaVO item;
            while (rs.next()) {
                item = new BicicletaVO();
                item.setCodBarras(rs.getString(1));
                item.setUsuNumIdentificacion(rs.getString(2));
                item.setMarca(rs.getString(3));
                item.setColor(rs.getString(4));
                item.setNumSerie(rs.getString(5));
                bici.add(item);
            }

        } catch (DaoException de) {
            logger.error("fun:buscarCanalAfiliacionByCodCanal -> Error de conexión en la ejecuciópn del SQL", de);
            throw de;
        } catch (SQLException se) {
            logger.error("fun:buscarCanalAfiliacionByCodCanal -> Error en la ejecución del SQL", se);
            throw se;
        } finally {
            closeResources(con, ps, rs);
        }

        return bici;
    }
    
    public BicicletaVO buscarUsuarioPorCodBarras(String codbarras) throws DaoException, SQLException {

        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        BicicletaVO biciCod = null;

        try {
            con = getConeccionSisbici();
            StringBuilder sql = new StringBuilder();
            sql.append("SELECT cod_barras,identificacion_usu , marca, color, num_serie ");
            sql.append("FROM public.bicicleta ");
            sql.append("where cod_barras = ?");
 
            ps = con.prepareStatement(sql.toString());
            int i = 1;
            ps.setString(i++, codbarras);
            
            StringBuilder sbLog = new StringBuilder();
            sbLog.append("SQL log: [").append(sql.toString()).append("]");
            sbLog.append(codbarras).append("]");
            
            logger.info(sbLog.toString());

            long t1 = System.currentTimeMillis();
            rs = ps.executeQuery();
            long t2 = System.currentTimeMillis();

            logger.info("Tiempo SQL: " + (t2 - t1) + "ms.");
            
            if (rs.next()) {
                biciCod = new BicicletaVO();
                biciCod.setCodBarras(rs.getString(1));
                biciCod.setUsuNumIdentificacion(rs.getString(2));
                biciCod.setMarca(rs.getString(3));
                biciCod.setColor(rs.getString(4));
                biciCod.setNumSerie(rs.getString(5));
            }

        } catch (DaoException de) {
            logger.error("fun:buscarCanalAfiliacionByCodCanal -> Error de conexión en la ejecuciópn del SQL", de);
            throw de;
        } catch (SQLException se) {
            logger.error("fun:buscarCanalAfiliacionByCodCanal -> Error en la ejecución del SQL", se);
            throw se;
        } finally {
            closeResources(con, ps, rs);
        }

        return biciCod;
    }



}
